package cn.agiledata.bank.audit.service;

import cn.agiledata.bank.audit.exception.AuditException;
import cn.agiledata.bank.hibernateBean.AuditOperandType;
import cn.agiledata.bank.hibernateBean.AuditRule;
import cn.agiledata.bank.hibernateBean.AuditStep;
import cn.agiledata.bank.hibernateBean.Operator;
import cn.agiledata.bank.hibernateBean.UserInfo;

public interface AuditRuleService {

    /**
     * 获取前台企业用户审核规则列表。<br>
     * 如果考虑审核规则的有效性，则过滤掉无效的审核规则
     * 
     * @param accountId
     *            企业用户账户id
     * @param validityRelated
     *            是否考虑审核规则的有效性
     * @return 企业用户审核规则列表
     */
    public AuditRule[] getUserAuditRuleList(long accountId,
            boolean validityRelated);

    public AuditOperandType[] getAuditOperandTypes(boolean systemType);

    public AuditRule addUserAuditRule(Operator operator,
            long auditOperandTypeId, String name, int valid,
            AuditStep[] auditSteps) throws AuditException;

    public AuditRule amendUserAuditRule(long auditRuleId, Operator operator,
            long auditOperandTypeId, String name, int valid,
            AuditStep[] auditSteps) throws AuditException;

    public boolean removeAuditRule(long auditRuleId);

    public AuditRule getAuditRuleById(long id);

    /**
     * 获取后台系统审核规则列表。<br>
     * 如果考虑审核规则的有效性，则过滤掉无效的审核规则
     * 
     * @param validityRelated
     *            是否考虑审核规则的有效性
     * @return 企业用户审核规则列表
     */
    public AuditRule[] getSystemAuditRuleList(boolean validityRelated);

    public AuditRule addSystemAuditRule(UserInfo user, long auditOperandTypeId,
            String name, int valid, AuditStep[] auditSteps)
            throws AuditException;

    public AuditRule amendSystemAuditRule(long auditRuleId, UserInfo user,
            long auditOperandTypeId, String name, int valid,
            AuditStep[] auditSteps) throws AuditException;

    /**
     * 判断指定前台账户的所有审核规则的审核组中是否包含指定操作员。 <br>
     * 如果考虑审核规则的有效性，则不检查无效的审核规则中是否包含指定操作员
     * 
     * @param accountId
     *            账户id
     * @param operatorId
     *            操作员id
     * @param validityRelated
     *            是否考虑审核规则的有效性
     * @return true if 指定账户的所有审核组中包含指定操作员, otherwise false
     */
    public boolean containsOperator(long accountId, long operatorId,
            boolean validityRelated);

    /**
     * 判断后台的所有审核规则的审核组中是否包含指定后台用户。 <br>
     * 如果考虑审核规则的有效性，则不检查无效的审核规则中是否包含指定后台用户
     * 
     * @param userId
     *            后台用户id
     * @param validityRelated
     *            是否考虑审核规则的有效性
     * @return true if 后台的所有审核组中包含指定后台用户, otherwise false
     */
    public boolean containsUser(long userId, boolean validityRelated);

    /**
     * 前台企业操作员修改审核规则的有效性
     * 
     * @param auditRuleId
     *            审核规则id
     * @param valid
     *            是否有效
     * @param operator
     *            前台企业操作员
     * @throws AuditException
     *             如果操作过程中出现错误
     */
    public void amendAuditRuleValidity(long auditRuleId, boolean valid,
            Operator operator) throws AuditException;

    /**
     * 后台用户修改审核规则的有效性
     * 
     * @param auditRuleId
     *            审核规则id
     * @param valid
     *            是否有效
     * @param user
     *            后台用户
     * @throws AuditException
     *             如果操作过程中出现错误
     */
    public void amendAuditRuleValidity(long auditRuleId, boolean valid,
            UserInfo user) throws AuditException;
}